{
  //声明一个类之后, 同时会产生一个类型
  class Person{
    // 属性
    name:string;
    age: number;
    type: string = '人';

    // 方法
    constructor(name: string, age: number){
      this.name = name;
      this.age = age;
    }

    //介绍
    intro():void{
      console.log(this.name + this.age);
    }

    //返回 name 属性的值
    getName(){
      return this.name;
    }

  }

  class Student extends Person{
    //子类如果包含了构造方法, 必须要调用 super 函数
    constructor(name: string, age: number){
      super(name, age);
    }

    learn(){
      console.log('可以学习....');
    }

    play(){
      console.log('玩耍....');
    }

  }

  //实例化
  let pangbo = new Person('庞博', 28);
  // console.log(pangbo.getName());
  // console.log(pangbo);

  //实例化
  // let stu = new Student('张伟', 18);
  // stu.play();
  // console.log(stu);
  
  //类型注解
  // let me:Person = new Person('xiaohigh', 30);

  // class C{
  //   name: string = 'xxx';
  //   test: number = 123;
  // }

  // let c: C = new C();
}

{
  //声明一个类
  class Parent{
    public a:string = 'aaa';
    protected b:string = 'bbb';
    private c:string = 'ccc';

    //测试方法
    selfTest(){
      // console.log(this.a);
      // console.log(this.b);
      console.log(this.c);
    }

    getC(){
      //判断
    }
  }

  class Son extends Parent{
    test(){
      // console.log(this.a);
      // console.log(this.b);
      // console.log(this.c);//属性“c”为私有属性，只能在类“Parent”中访问
    }
  }

  //实例化 Son 对象
  let s:Son = new Son();

  //输出测试
  //类外部
  // console.log(s.a);
  // console.log(s.b);//属性“b”受保护，只能在类“Parent”及其子类中访问
  // console.log(s.c); //属性“c”为私有属性，只能在类“Parent”中访问
  //子类
  s.test();
  //自身类内部方法
  s.selfTest();
  

}